package com.xxxtea.controller;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xxxtea.common.MerchantContext;
import com.xxxtea.common.Result;
import com.xxxtea.dto.PageQuery;
import com.xxxtea.entity.Dish;
import com.xxxtea.entity.Merchant;
import com.xxxtea.entity.Review;
import com.xxxtea.service.DishService;
import com.xxxtea.service.MerchantService;
import com.xxxtea.service.ReviewService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;

/**
 * 菜品控制器
 *
 * 提供菜品的完整管理功能，包括：
 * - 菜品的增删改查
 * - 分页查询和条件筛选
 * - 菜品推荐功能
 * - 浏览历史和搜索记录
 * - 商家关联和评价查询
 *
 * 使用Swagger注解进行API文档生成
 * 使用Lombok注解简化代码
 *
 * @author badman
 * @since 1.0.0
 */
@Slf4j
@Api("菜品接口")
@RestController
@RequestMapping("/dish")
public class DishController {
	/**
	 * 菜品服务
	 */
	@Resource
	private DishService dishService;
	
	/**
	 * 评价服务
	 */
	@Resource
	private ReviewService reviewService;
	
	/**
	 * 商家服务
	 */
	@Resource
	private MerchantService merchantService;

	/**
	 * 新增菜品
	 * 自动设置当前商家ID
	 *
	 * @param request 菜品信息
	 * @return 操作结果
	 */
	@PostMapping
	@ApiOperation("新增菜品")
	public Result<String> save(@RequestBody Dish request) {
		request.setMerchantId(MerchantContext.getId());
		if (!dishService.save(request)) {
			return Result.error("添加失败!");
		}
		return Result.success();
	}

	/**
	 * 删除菜品
	 *
	 * @param id 菜品ID
	 * @return 操作结果
	 */
	@DeleteMapping("/{id}")
	@ApiOperation("删除菜品")
	public Result<String> delete(@PathVariable String id) {
		if (!dishService.removeById(id)) {
			return Result.error("删除失败!");
		}
		return Result.success();
	}

	/**
	 * 更新菜品
	 *
	 * @param request 菜品信息
	 * @return 操作结果
	 */
	@PutMapping
	@ApiOperation("更新菜品")
	public Result<String> update(@RequestBody Dish request) {
		if (!dishService.updateById(request)) {
			return Result.error("更新失败!");
		}
		return Result.success();
	}

	/**
	 * 获取单个菜品详情
	 * 包含商家信息、评价列表，并记录浏览历史
	 *
	 * @param id 菜品ID
	 * @return 菜品详情信息
	 */
	@GetMapping("/{id}")
	@ApiOperation("获取单个菜品")
	public Result<Dish> getOne(@PathVariable Integer id) {
		// 保存浏览历史
		dishService.saveBrowseHistory(id);
		Dish dish = dishService.getById(id);
		// 获取商家信息
		Merchant merchant = merchantService.getById(dish.getMerchantId());
		// 设置额外数据（如距离、收藏状态等）
		dishService.setExtraData(Collections.singletonList(dish));
		dish.setMerchant(merchant);

		// 查询菜品的评价列表
		List<Review> reviewList = reviewService.lambdaQuery().eq(Review::getBusinessType, Review.BusinessType.DISH)
				.eq(Review::getBusinessId, id).list();
		dish.setReviewList(reviewList);
		return Result.success(dish);
	}

	/**
	 * 获取菜品列表
	 *
	 * @param request 查询条件
	 * @return 菜品列表
	 */
	@GetMapping("/list")
	@ApiOperation("获取菜品列表")
	public Result<List<Dish>> list(Dish request) {
		LambdaQueryWrapper<Dish> wrapper = new LambdaQueryWrapper<>(request);
		return Result.success(dishService.list(wrapper));
	}

	/**
	 * 分页查询菜品
	 * 支持价格范围、评分等条件筛选，并保存搜索历史
	 *
	 * @param request 分页查询条件
	 * @return 分页菜品列表
	 */
	@PostMapping("/page")
	@ApiOperation("分页查询菜品")
	public Result<Page<Dish>> page(@RequestBody PageQuery<Dish> request) {
		// 分页查询
		Dish param = request.getParam();
		LambdaQueryWrapper<Dish> wrapper = new LambdaQueryWrapper<>(param);
		// 价格范围筛选
		wrapper.ge(param.getMinPrice() != null, Dish::getPrice, param.getMinPrice());
		wrapper.le(param.getMaxPrice() != null, Dish::getPrice, param.getMaxPrice());
		// 评分范围筛选
		wrapper.ge(param.getMinRating() != null, Dish::getRating, param.getMinRating());
		// 按ID倒序排列
		wrapper.orderByDesc(Dish::getId);
		// 保存搜索历史
		dishService.saveSearchHistory(param);
		Page<Dish> pageResult = dishService.page(request.toPage(), wrapper);
		// 设置额外数据
		dishService.setExtraData(pageResult.getRecords());
		return Result.success(pageResult);
	}

	/**
	 * 获取推荐菜品
	 * 随机推荐4个菜品
	 *
	 * @return 推荐菜品列表
	 */
	@PostMapping("/recommend")
	@Operation(summary = "获取推荐菜品")
	public Result<List<Dish>> recommend() {
		List<Dish> dishList = dishService.list();
		// 随机打乱列表
		Collections.shuffle(dishList);
		// 返回前4个菜品
		return Result.success(CollUtil.sub(dishList, 0, 4));
	}
}
